﻿using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Security.Principal;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using skags.Models;

/*
* University of Reykjavík
* Brjóstagjöf.is is the product of first-year practical programming course
* for computer science students at said university
*
* URL: http://code.google.com/p/scags
* Authors: 
* Ástvaldur Sigurðsson
* Guðjón Jónsson
* Kristín Inga Vigfúsdóttir
* Steinar Bragi Sigurðsson
* Sveinn Ernstsson
*/

namespace skags.Controllers
{
    [HandleError]
    [LogError]
    [Authorize(Roles = "Admin")]
    public class AdminController : Controller
    {
        private IDataRepository m_rep;

        /* Þessum smiðum var baett við til þess að haegt vaeri að útfaera unit testing */
        public AdminController()
        {
            pageRep = new PageRepository();
            userRep = new UserRepository();
            newsRep = new NewsRepository();
            articleRep = new ArticleRepository();
            forumRep = new ForumRepository();
            linksRep = new LinksRepository();
            pollRep = new PollRepository();
            m_rep = new ArticleRepository();
            dbRep = new DBRepository();
        }

        public AdminController(IDataRepository iRep)
        {
            m_rep = iRep;
        }

        UserRepository userRep;
        NewsRepository newsRep;
        ArticleRepository articleRep;
        ForumRepository forumRep;
        LinksRepository linksRep;
        PollRepository pollRep;
        PageRepository pageRep;
        DBRepository dbRep;
        //
        /* GET: /Admin/ */

        /* GET: Forsíða stjórnborðs */
        public ActionResult Index()
        {
            // Athugum hvort við getum birt fjölda birtingu síðu
            if (dbRep.Viewcounter().HasValue)
                ViewData["PageViews"] = dbRep.Viewcounter();

            else
                ViewData["PageViews"] = 0;

            return View();
        }

        /*
         * SÍÐUR
         */

        // GET: Birta allar síður
        public ActionResult Pages()
        {
            // Sækjum allar síðurnar
            var allPages = pageRep.GetAllPages();

            return View(allPages);
        }

        /* GET: Búa til síðu */
        public ActionResult CreatePage(int? id)
        {
            // Athugum hvort síðan sé undirsíða
            bool subpage = id.HasValue && pageRep.IsSubPage(id);

            // Sækjum alla flokka síðu, fallið tekur við hvort síðan sé undirsíða eða ekki
            var allCategories = pageRep.GetAllPageCategories(subpage, id);

            // Sendum inn í viewið hvort síðan sé undirsíða eða ekki
            ViewData["CreateSubPage"] = subpage.ToString();

            // Foreldri síðunnar
            var parentID = subpage ? id.Value : 0;

            return View(new PageCatViewModel { ParentID = parentID, Categories = allCategories });
        }

        /* POST: Búa til síðu */
        [HttpPost]
        [ValidateInput(false)]
        public ActionResult CreatePage(Page item)
        {
            if (!ModelState.IsValid)
                throw new Exception("Eitthvað fór úrskeiðis. Farðu til baka og lagaðu það.");

            // Setjum default gildi
            item.SubPage = false;

            // Sækjum hash kóða ID höfundarins
            item.CreatorID = userRep.GetHashIDByUsername(User.Identity.Name);

            // Núverandi dagsetning
            item.DateCreated = DateTime.Now;

            // Athugum hvort síðan sé yfir- eða undirsíða
            if (Request.Form["CreateSubPage"] == "True")
                item.SubPage = true;

            // Köllum á fall sem sér um að vista síðuna í gagnagrunni
            pageRep.AddPage(item);

            return RedirectToAction("Pages");
        }

        /* GET: Breyta síðu */
        public ActionResult EditPage(int id)
        {
            // Sækjum síðuna sem við erum að breyta
            var thePage = pageRep.GetPageByID(id);

            // Ef síðan finnst ekki, köstum við villu
            if( thePage == null )
                throw new Exception("Þessi síða er ekki til!");

            // Athugum hvort síðan sé undirsíða eða ekki
            bool subpage = thePage.SubPage == true ? true : false;

            // Sækjum alla flokka síðunnar
            var allCategories = pageRep.GetAllPageCategories(subpage, id);

            // Sendum inn í viewið hvort síðan sé undirsíða eða ekki
            ViewData["CreateSubPage"] = subpage.ToString();

            return View(new PageCatViewModel
                            {
                                ID = thePage.ID,
                                Title = thePage.Title,
                                CreatorID = thePage.CreatorID,
                                DateCreated = thePage.DateCreated,
                                Text = thePage.Text,
                                ParentID = thePage.ParentID,
                                ParentName = pageRep.GetTitleByParentID(thePage.ParentID),
                                SubPage = subpage,
                                Categories = allCategories
                            });
        }

        /* POST: Breyta síðu */
        [HttpPost]
        [ValidateInput(false)]
        public ActionResult EditPage(Page item)
        {
            // Ef síðan á enga yfirsíðu/flokk, köstum við villu
            if(item.ParentID == 0)
                throw new Exception("Það verður að vera einhver yfirsíða!");

            if (!ModelState.IsValid)
                throw new Exception("Eitthvað fór úrskeiðis. Farðu til baka og lagaðu það.");

            // Köllum á fall sem sér um að uppfæra síðuna í gagnagrunni
            pageRep.UpdatePage(item);

            return RedirectToAction("Pages");
        }

        /* GET: Eyða síðu */
        public ActionResult DeletePage(int id)
        {
            // Eyðum síðunni sem notandi biður um
            // Fallið sér sjálft um að kasta villu ef síðan er ekki til
            pageRep.DeletePage(id);

            return RedirectToAction("Pages");
        }

        /*
         * FRÉTTIR
         */

        /* GET: Saekir allar fréttir */
        public ActionResult News()
        {
            // Köllum á fall sem sækir allar fréttir í gagnagrunni
            var allNews = newsRep.GetAllNews();

            return View(allNews);
        }

        /* GET: Breyta frétt */
        public ActionResult EditNews(int id)
        {
            // Sækjum alla flokka fréttar eftir ákveðnu ID
            var theNews = newsRep.GetNewsCatByID(id);

            // Ef fréttin er ekki til, köstum við villu
            if (theNews == null)
                throw new Exception("Þessi frétt er ekki til!");

            return View(theNews);
        }

        /* POST: Breyta frétt */
        [HttpPost]
        [ValidateInput(false)]
        public ActionResult EditNews(New item)
        {
            bool ok = true;
            if (String.IsNullOrEmpty(item.Text)) //Athugum hvort reitir séu rétt útfylltir
            {
                ModelState.AddModelError("Text", "Fréttin má ekki vera tóm."); //Birtum villu ef það vantar textann
                ok = false;
            }

            if (String.IsNullOrEmpty(item.Title))
            {
                ModelState.AddModelError("Title", "Titillinn má ekki vera tómur.");
                ok = false;
            }

            if (!ok)
            {
                var allCategories = newsRep.GetAllCategories();

                return View(new NewsCatViewModel { Categories = allCategories });
            }
            // ef allt fer að óskum komumst við hingað.
            // Köllum á fall sem sér um að uppfæra frétt í gagnagrunni
            newsRep.UpdateNews(item);

            return RedirectToAction("News");
        }

        /* GET: Búa til frétt */
        public ActionResult CreateNews()
        {
            // Sækjum alla flokka allra frétta
            var allCategories = newsRep.GetAllCategories();

            return View(new NewsCatViewModel { Categories = allCategories });
        }

        /* POST: Búa til frétt */
        [HttpPost]
        [ValidateInput(false)]
        public ActionResult CreateNews(New item)
        {
            
            
            // Sækjum hash kóða ID höfundarins
            item.CreatorID = userRep.GetHashIDByUsername(User.Identity.Name);
            // Núverandi dagsetning
            item.DateCreated = DateTime.Now;

            bool ok = true;
            if (String.IsNullOrEmpty(item.Text)) //Athugum hvort reitir séu rétt útfylltir
            {
                ModelState.AddModelError("Text","Fréttin má ekki vera tóm."); //Birtum villu ef það vantar textann
                ok = false;
            }

            if (String.IsNullOrEmpty(item.Title))
            {
                ModelState.AddModelError("Title", "Titillinn má ekki vera tómur.");
                ok = false;
            }

            if(!ok)
            {
                var allCategories = newsRep.GetAllCategories();

                return View(new NewsCatViewModel { Categories = allCategories });
            }
            
            // Köllum á fall sem sér um að bæta fréttinni í gagnagrunn
            newsRep.AddNews(item);

            return RedirectToAction("News");
        }

        /* GET: Eyða frétt */
        public ActionResult DeleteNews(int id)
        {
            // Köllum á fall sem sér um að eyða frétt úr gagnagrunni
            newsRep.DeleteNews(id);

            return RedirectToAction("News");
        }

        /*
         * FRÉTTAFLOKKAR
         */

        /* GET: Saeka alla flokka */
        public ActionResult NewsCategories()
        {
            // Köllum á fall sem sér um að sækja alla flokka allra frétta
            var allCat = newsRep.GetAllCategories();

            return View(allCat);
        }

        /* GET: Breyta fréttaflokk */
        public ActionResult EditNewsCategory(int id)
        {
            // Köllum á fall sem sér um að sækja alla flokka eftir ákveðnu ID
            var theCat = newsRep.GetNewsCategoryByID(id);

            // Ef hún skilar engu, köstum við villu
            if (theCat == null)
                throw new Exception("Þessi fréttaflokkur er ekki til!");

            return View(theCat);
        }

        /* POST: Breyta fréttaflokk */
        [HttpPost]
        public ActionResult EditNewsCategory(NewsCategory item)
        {
            bool ok = true;

            if (String.IsNullOrEmpty(item.Title))
            {
                ModelState.AddModelError("Title", "Titillinn má ekki vera tómur");
                ok = false;
            }

            if (!ok)
            {
                var theCat = newsRep.GetNewsCategoryByID(item.ID);

                // Ef hún skilar engu, köstum við villu
                if (theCat == null)
                    throw new Exception("Þessi fréttaflokkur er ekki til!");

                return View(theCat);
            }

            // Köllum á fall sem sér um að uppfæra fréttaflokkinn í gagnagrunni
            newsRep.UpdateNewsCategory(item);

            return RedirectToAction("NewsCategories");
        }

        /* GET: Búa til fréttaflokk */
        public ActionResult CreateNewsCategory()
        {
            return View();
        }

        /* POST: Búa til fréttaflokk */
        [HttpPost]
        public ActionResult CreateNewsCategory(NewsCategory item)
        {
            bool ok = true;

            if (String.IsNullOrEmpty(item.Title))
            {
                ModelState.AddModelError("Title", "Titillinn má ekki vera tómur.");
                ok = false;
            }

            if (ok == false)
            {
                return View();
            }

            // Köllum á fall sem sér um að bæta flokki í gagnagrunn
            newsRep.AddNewsCategory(item);

            return RedirectToAction("NewsCategories");
        }

        /* GET: Eyða fréttaflokk */
        public ActionResult DeleteNewsCategory(int id)
        {
            // Köllum á fall sem sér um að eyða falli úr gagnagrunni
            newsRep.DeleteNewsCategory(id);

            return RedirectToAction("NewsCategories");
        }


        /*
         * GREINAR
         */

        /* GET: Saekir allar greinar */
        public ActionResult Articles()
        {
            // Köllum á fall sem sér um að sækja allar greinar í gagnagrunninum
            var allArticles = articleRep.GetAllArticles();

            return View(allArticles);
        }

        /* GET: Breyta grein */
        public ActionResult EditArticle(int id)
        {
            // Köllum á fall sem sækir ákveðna grein/flokk eftir ákveðnu ID
            var theArticle = articleRep.GetArticleCatByID(id);

            // Ef við fáum enga niðurstöðu köstum við villu
            if (theArticle == null)
                throw new Exception("Þessi grein er ekki til!");

            return View(theArticle);
        }

        /* POST: Breyta grein */
        [HttpPost]
        [ValidateInput(false)]
        public ActionResult EditArticle(Article item)
        {
            bool ok = true;
            if (String.IsNullOrEmpty(item.Text)) //Athugum hvort reitir séu rétt útfylltir
            {
                ModelState.AddModelError("Text", "Fréttin má ekki vera tóm."); //Birtum villu ef það vantar textann
                ok = false;
            }

            if (String.IsNullOrEmpty(item.Title))
            {
                ModelState.AddModelError("Title", "Titillinn má ekki vera tómur.");
                ok = false;
            }

            if (!ok)
            {
                var allCategories = articleRep.GetAllCategories();

                return View(new ArticleCatViewModel { Categories = allCategories });
            }

            // Köllum á fall sem sér um að uppfæra greinina í gagnagrunni
            articleRep.UpdateArticle(item);

            return RedirectToAction("Articles");
        }

        /* GET: Búa til grein */
        public ActionResult CreateArticle()
        {
            // Fall sem sækir alla flokka allra greina
            var allCategories = articleRep.GetAllCategories();

            return View(new ArticleCatViewModel { Categories = allCategories });
        }

        /* POST: Búa til grein */
        [HttpPost]
        [ValidateInput(false)]
        public ActionResult CreateArticle(Article item)
        {
            
            // Sækjum hash kóða ID höfundarins
            item.CreatorID = userRep.GetHashIDByUsername(User.Identity.Name);
            // Núverandi Dagsetning
            item.DateCreated = DateTime.Now;
            // Fall sem sér um að bæta grein í gagnagrunn

            bool ok = true;
            if (String.IsNullOrEmpty(item.Text)) //Athugum hvort reitir séu rétt útfylltir
            {
                ModelState.AddModelError("Text", "Fréttin má ekki vera tóm."); //Birtum villu ef það vantar textann
                ok = false;
            }

            if (String.IsNullOrEmpty(item.Title))
            {
                ModelState.AddModelError("Title", "Titillinn má ekki vera tómur.");
                ok = false;
            }

            if (!ok)
            {
                var allCategories = articleRep.GetAllCategories();

                return View(new ArticleCatViewModel { Categories = allCategories });
            }

            //ef allt fer að óskum komumst við hingað og vistum frétt í gagnagrunn
            articleRep.AddArticle(item);

            return RedirectToAction("Articles"); //förum aftur í yfirlit
        }

        /* GET: Eyða grein */
        public ActionResult DeleteArticle(int id)
        {
            // Fall sem sér um að eyða grein úr gagnagrunni
            articleRep.DeleteArticle(id);

            return RedirectToAction("Articles");
        }

        /*
         * GREINAFLOKKAR
         */

        /* GET: Ná í alla Greinaflokka */
        public ActionResult ArticleCategories()
        {
            // Fall sem sækir alla flokka greina
            var allCat = articleRep.GetAllCategories();

            return View(allCat);
        }

        /* GET: Breyta greinaflokk */
        public ActionResult EditArticleCategory(int id)
        {
            // Fall sem sækir greinaflokk eftir ákveðnu ID
            var theCat = articleRep.GetArticleCategoryByID(id);

            // Ef við fáum engar niðurstöður köstum við villu
            if (theCat == null)
                throw new Exception("Þessi greinaflokkur er ekki til!");

            return View(theCat);
        }

        /* POST: Breyta greinaflokk */
        [HttpPost]
        public ActionResult EditArticleCategory(ArticleCategory item)
        {
            if (!ModelState.IsValid)
                throw new Exception("Tókst ekki að breyta greinaflokk");

            // Fall sem sér um að uppfæra greinaflokk í gagnagrunni
            articleRep.UpdateArticleCategory(item);

            return RedirectToAction("ArticleCategories");
        }

        /* GET: Búa til greinaflokk */
        public ActionResult CreateArticleCategory()
        {
            return View();
        }
        
        /* POST: Búa til greinaflokk */
        [HttpPost]
        public ActionResult CreateArticleCategory(ArticleCategory item)
        {

            if (!ModelState.IsValid)
                throw new Exception("Tókst ekki að búa til greinaflokk");
            
            if (item.Title == null || item.Title.ToString() == "")
            {
                ModelState.AddModelError("Title", "Titillinn má ekki vera tómur");
                return View("Error");
            }

            // Fall sem sér um að bæta greinaflokk í gagnagrunn
            m_rep.AddArticleCategory(item);

            return RedirectToAction("ArticleCategories");
        }

        /* GET: Eyða greinaflokk */
        public ActionResult DeleteArticleCategory(int id)
        {
            // Fall sem sér um að eyða greinaflokk úr gagnagrunni
            articleRep.DeleteArticleCategory(id);

            return RedirectToAction("ArticleCategories");
        }

        /*
         * NOTENDUR
        */

        /* GET: Birta alla notendur */
        public ActionResult Users()
        {
            // Fall sem sækir alla notendur úr gagnagrunni
            var allUsers = userRep.GetAllUsers();

            return View(allUsers);
        }

        /* GET: Breyta notanda */
        public ActionResult EditUser(int id)
        {
            // Sækjum ákveðinn notanda eftir ákveðnu ID
            var theUser = userRep.GetUserByID(id);

            // Ef notandinn finnst ekki, köstum við villu
            if (theUser == null)
                throw new Exception("Notandi er ekki til!");

            return View(theUser);
        }

        /* POST: Breyta notanda */
        [HttpPost]
        public ActionResult EditUser(UserInfo user)
        {
            // Fall sem sér um að uppfæra notanda í gagnagrunni
            userRep.UpdateUser(user);

            return RedirectToAction("Users");
        }

        /* GET: Búa til notanda */
        public ActionResult CreateUser()
        {
            return View();
        }

        /* POST: Búa til notanda */
        [HttpPost]
        [HandleError]
        public ActionResult CreateUser(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
                // Reynum að búa til notandann
                MembershipUser newUser = Membership.CreateUser(model.UserName, model.Password, model.Email);

                // Hér bætum við upplýsingum inn í UserInfo töfluna - Gaui 7. maí 04:14
                UserInfo info = userRep.GetNewestUser();

                info.SSN = model.SSN;
                info.FullName = model.FullName;
                info.Address = model.Address;
                info.ZipCode = Convert.ToInt32(model.ZipCode);
                userRep.Save();

                // Endar hér

                if( newUser != null)
                    return RedirectToAction("Users", "Admin");
            }

            // Eitthvað klikkaði, birtum formið aftur
            return View(model);
        }

        /* GET: Eyða notanda */
        public ActionResult DeleteUser(int id)
        {
            // Reynum að eyða notanda, ef það tekst ekki köstum við villu
            if (!userRep.DeleteUser(id))
                throw new Exception("Gat ekki eytt notanda");

                return RedirectToAction("Users");          
        }

        /* GET: Bæta/eyða hlutverki við notanda */
        public ActionResult UpdateRole(int id, string role)
        {
            // Uppfærum hlutverk notanda
            userRep.UpdateUserRoles(id, role);

            return RedirectToAction("Users");
        }

        /*
         * TENGLAR
         */

        /* GET: Saekja alla linka */
        public ActionResult Links()
        {
            // Fall sem sækir alla tengla í gagnagrunni
            var allLinks = linksRep.GetAllLinks();

            return View(allLinks);
        }

        /* GET: Breyta tengli */
        [HandleError]
        [LogError]
        public ActionResult EditLink(int id)
        {
            // Fall sem sækir alla tengla eftir ákveðnu ID
            var theLink = linksRep.GetLinkCatByID(id);

            // Ef við fáum enga niðurstöðu, köstum við villu
            if (theLink == null)
                throw new Exception("Þessi tengill er ekki til!");

            return View(theLink);
        }

        /* POST: Breyta tengli */
        [HttpPost]
        public ActionResult EditLink(Link item)
        {
            bool ok = true;
            if (String.IsNullOrEmpty(item.Title))
            {
                ModelState.AddModelError("Title", "Titillinn má ekki vera tómur");
                ok = false;
            }
            if (String.IsNullOrEmpty(item.Url))
            {
                ModelState.AddModelError("Url", "Slóðin má ekki vera tóm");
            }

            if (!ok)
            {
                var theLink = linksRep.GetLinkCatByID(item.ID);

                // Ef við fáum enga niðurstöðu, köstum við villu
                if (theLink == null)
                    throw new Exception("Þessi tengill er ekki til!");

                return View(theLink);
            }

            // Fall sem sér um að uppfæra tengilinn í gagnagrunni
            linksRep.UpdateLink(item);

            return RedirectToAction("Links");
        }

        /* GET: Búa til tengil */
        public ActionResult CreateLink()
        {
            // Fall sem sækir alla tenglaflokka
            var allCategories = linksRep.GetAllCategories();

            return View(new LinkCatViewModel { Categories = allCategories });
        }

        /* POST: Búa til tengil */
        [HttpPost]
        public ActionResult CreateLink(Link item)
        {
            bool ok = true;
            if (String.IsNullOrEmpty(item.Title))
            {
                ModelState.AddModelError("Title", "Titillinn má ekki vera tómur");
                ok = false;
            }
            if (String.IsNullOrEmpty(item.Url))
            {
                ModelState.AddModelError("Url", "Slóðin má ekki vera tóm");
            }

            if (!ok)
            {
                var allCategories = linksRep.GetAllCategories();

                return View(new LinkCatViewModel { Categories = allCategories });
            }

            // Sækjum hash kóða ID höfundarins
            item.CreatorID = userRep.GetHashIDByUsername(User.Identity.Name);

            // Fall sem sér um að bæta tenglinum inn í gagnagrunn
            linksRep.AddLink(item);

            return RedirectToAction("Links");
        }

        /* GET: Eyða tengli */
        public ActionResult DeleteLink(int id)
        {
            // Fall sem sér um að eyða tenglinum út
            linksRep.DeleteLink(id);

            return RedirectToAction("Links");
        }

        /*
         * TENGLAFLOKKAR
         */

        /* GET: Saekja alla tenglaflokka */
        public ActionResult LinkCategories()
        {
            // Fall sem sækir alla tenglaflokka
            var allCat = linksRep.GetAllCategories();

            return View(allCat);
        }

        /* GET: Breyta tenglaflokk */
        public ActionResult EditLinkCategory(int id)
        {
            // Fall sem sækir alla tenglaflokka
            var theCat = linksRep.GetLinkCategoryByID(id);

            // Ef við fáum engar niðurstöður, köstum við villu
            if (theCat == null)
                throw new Exception("Þessi tenglaflokkur er ekki til!");

            return View(theCat);
        }

        /* POST: Breyta tenglaflokk */
        [HttpPost]
        public ActionResult EditLinkCategory(LinkCategory item)
        {
            bool ok = true;
            if (String.IsNullOrEmpty(item.Title))
            {
                ModelState.AddModelError("Title", "Titillinn má ekki vera tómur");
                ok = false;
            }
            
            if (!ok)
            {
                // Fall sem sækir alla tenglaflokka
                var theCat = linksRep.GetLinkCategoryByID(item.ID);

                // Ef við fáum engar niðurstöður, köstum við villu
                if (theCat == null)
                    throw new Exception("Þessi tenglaflokkur er ekki til!");

                return View(theCat);
            }

            // Fall sem uppfærir tenglaflokk í gagnagrunni
            linksRep.UpdateLinkCategory(item);

            return RedirectToAction("LinkCategories");
        }

        /* GET: Búa til tenglaflokk */
        public ActionResult CreateLinkCategory()
        {
            return View();
        }

        /* POST: Búa til tenglaflokk */
        [HttpPost]
        public ActionResult CreateLinkCategory(LinkCategory item)
        {
            bool ok = true;
            if (String.IsNullOrEmpty(item.Title))
            {
                ModelState.AddModelError("Title", "Titillinn má ekki vera tómur");
                ok = false;
            }

            if (!ok)
            {
                return View();
            }

            // Fall sem bætir nýjum tenglaflokk í gagnagrunninn
            linksRep.AddLinkCategory(item);

            return RedirectToAction("LinkCategories");
        }

        /* GET: Eyða tenglaflokk */
        public ActionResult DeleteLinkCategory(int id)
        {
            // Fall sem eyðir tenglaflokk úr gagnagrunni
            linksRep.DeleteLinkCategory(id);

            return RedirectToAction("LinkCategories");
        }

        /*
         * KANNANIR
         */

        /* GET: Birta kannanir */
        /* Fall sem sýnir allar kannanir í kerfinu */
        public ActionResult Polls()
        {
            // Fall sem sækir alla kannanir
            var result = pollRep.GetAllPolls();
            ViewData["AllPolls"] = result;
            return View();
        }

        /* GET: Fall sem býr til könnun */
        public ActionResult CreatePoll()
        {
            return View();
        }

        /* POST: Fall sem býr til könnun */
        [HttpPost]
        public ActionResult CreatePoll(Poll poll)
        {
            bool ok = true;
            if (String.IsNullOrEmpty(poll.Question))
            {
                ModelState.AddModelError("Question", "Titillinn má ekki vera tómur");
                ok = false;
            }

            if (!ok)
            {
                return View();
            }

            // Fall sem vistar könnun í gagnagrunni
            pollRep.CreatePoll(poll);
            return RedirectToAction("Polls");
        }

        /* GET: Fall sem breytir könnun */
        public ActionResult EditPoll(int id)
        {
            // Fall sem sækir ákveðna könnun eftir ID
            var thePoll = pollRep.GetPollById(id);

            if( thePoll == null )
                throw new Exception("Könnun fannst ekki!");

            return View(thePoll);
        }

        /* POST: Fall sem breytir könnun */
        [HttpPost]
        public ActionResult EditPoll(Poll poll)
        {
            bool ok = true;
            if (String.IsNullOrEmpty(poll.Question))
            {
                ModelState.AddModelError("Question", "Titillinn má ekki vera tómur");
                ok = false;
            }

            if (!ok)
            {
                return View();
            }
            // Köllum á fall sem uppfærir könnun í gagnagrunni
            pollRep.UpdatePoll(poll);
            return RedirectToAction("Polls");
        }

        /* GET: Fall sem eyðir könnun */
        public ActionResult DeletePoll(int id)
        {
            // Köllum á fall sem eyðir könnun úr gagnagrunni
            pollRep.RemovePoll(id);

            return RedirectToAction("Polls");
        }

        /* POST: Fall sem tekur við atkvaeði í könnunum */
        [HttpPost]
        public ActionResult VotePoll(FormCollection formData)
        {
            var val = formData["Opt"];
            pollRep.UpdateVote(val);
            return RedirectToAction("VotePoll");
        }

        /*
         * SPJALL
         */

        /* GET: Saekir alla flokka af spjalli */
        public ActionResult ForumCategories()
        {
            // Fall sem sækir alla spjallflokka
            var allCat = forumRep.GetAllCategories();

            return View(allCat);
        }

        /* GET: Búa til spjallFlokk */
        public ActionResult CreateForumCategory()
        {
            return View();
        }

        /* POST: Búa til spjallFlokk */
        [HttpPost]
        public ActionResult CreateForumCategory(ForumCategory item)
        {
            bool ok = true;
            if (String.IsNullOrEmpty(item.Title))
            {
                ModelState.AddModelError("Title", "Titillinn má ekki vera tómur");
                ok = false;
            }

            if (!ok)
            {
                return View();
            }

            // Fall sem bætir nýjum spjallflokki inn í gagnagrunn
            forumRep.AddForumCategory(item);

            return RedirectToAction("ForumCategories");
        }

        /* GET: Breyta spjallflokk */
        public ActionResult EditForumCategory(int id)
        {
            // Fall sem sækir spjallflokk eftir ákveðnu ID
            var theCat = forumRep.GetForumCategoryByID(id);

            // Ef flokkurinn finnst ekki, köstum við villu
            if (theCat == null)
                throw new Exception("Þessi spjallflokkur er ekki til!");

            return View(theCat);
        }

        /* POST: Breyta greinaflokk */
        [HttpPost]
        public ActionResult EditForumCategory(ForumCategory item)
        {
            bool ok = true;
            if (String.IsNullOrEmpty(item.Title))
            {
                ModelState.AddModelError("Title", "Titillinn má ekki vera tómur");
                ok = false;
            }

            if (!ok)
            {
                var theCat = forumRep.GetForumCategoryByID(item.ID);

                // Ef flokkurinn finnst ekki, köstum við villu
                if (theCat == null)
                    throw new Exception("Þessi spjallflokkur er ekki til!");

                return View(theCat);
            }

            // Fall sem sér um að uppfæra spjallflokk í gagnagrunni
            forumRep.UpdateForumCategory(item);

            return RedirectToAction("ForumCategories");
        }

        /* GET: Eyða spjallflokk og öllum hans þráðum */
        public ActionResult DeleteForumCategory(int id)
        {
            // Fall sem eyðir spjallflokki úr gagnagrunni
            forumRep.DeleteForumCategory(id);

            return RedirectToAction("ForumCategories");
        }

        /* GET: Byrting auglýsinga */
        public ActionResult Ads()
        {
            return View();
        }

        /* POST: Bannerupplýsingar fyrir banner (auglýsingu) 1 vistaðar*/
        [HttpPost]
        public ActionResult Ads1(HttpPostedFileBase file)
        {
            var path = "";
            if (file.ContentLength > 0)
            {
                var fileName = "ad1.jpg";
                path = Path.Combine(Server.MapPath("~/Content/banner/"), fileName);
                file.SaveAs(path);
            }
            return RedirectToAction("Ads");
        }

        /* POST: Bannerupplýsingar fyrir banner (auglýsingu) 2 vistaðar*/
        [HttpPost]
        public ActionResult Ads2(HttpPostedFileBase file)
        {
            if (file.ContentLength > 0)
            {
                var fileName = "ad2.jpg";
                var path = Path.Combine(Server.MapPath("~/Content/banner/"), fileName);
                file.SaveAs(path);
            }
            return RedirectToAction("Ads");
        }
    }
}